#include "i2c_dma.h"

void i2c_dma_config()
{
    // 设置引脚复用
    rcu_periph_clock_enable(I2C_RCU_GPIO_PORN);

    // 时钟线引脚:SCL ,复用输出,开漏,浮空
    gpio_mode_set(I2C_SCL_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, I2C_SCL_GPIO_PIN);
    gpio_af_set(I2C_SCL_GPIO_PORT, GPIO_AF_4, I2C_SCL_GPIO_PIN);
    gpio_output_options_set(I2C_SCL_GPIO_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_GPIO_PIN);

    // 数据线引脚:SDA ,复用输出,开漏,浮空
    gpio_mode_set(I2C_SDA_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, I2C_SDA_GPIO_PIN);
    gpio_af_set(I2C_SDA_GPIO_PORT, GPIO_AF_4, I2C_SDA_GPIO_PIN);
    gpio_output_options_set(I2C_SDA_GPIO_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SDA_GPIO_PIN);

    // 重置I2C0
    i2c_deinit(I2C0);
    // 打开I2C时钟
    rcu_periph_clock_enable(RCU_I2C0);
    // 配置I2C时钟,主体配置速度的low/high比例
    i2c_clock_config(I2C0, 100000, I2C_DTCY_2);
    // 设置模式与地址
    // 当前芯片作为主设备,所以地址设置0x00:如果是从设备,则需要具体的值
    i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0x00);
    // 开启i2c
    i2c_enable(I2C0);
    // ack使能
    i2c_ack_config(I2C0, I2C_ACK_ENABLE);
}

void i2c_dma_dma_config()
{
    // dma
    rcu_periph_clock_enable(RCU_DMA0);
    dma_deinit(DMA0, DMA_CH7);
    // 初始化结构体
    dma_single_data_parameter_struct dma_init_struct;
    // 初始化
    dma_single_data_para_init(&dma_init_struct);

    // 方向
    init_struct.direction = DMA_MEMORY_TO_PERIPH;
    // 内存增长
    init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    // 外设地址
    init_struct.periph_address = (uint32_t)(&I2C_DATA(I2C0));
    init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;

    //子配置
    dma_channel_substruct_init(&dma_init_struct);

}